#ifndef _INCLUDE_TSS_H_
#define _INCLUDE_TSS_H_

#include "thread.h"

struct tss_t
{
  uint32_t  backlink;
  uint32_t* esp0;
  uint32_t  ss0;
  uint32_t* esp1;
  uint32_t  ss1;
  uint32_t* esp2;
  uint32_t  ss2;
  uint32_t  cr3;
  uint32_t (*eip)();
  uint32_t eflags;
  uint32_t eax;
  uint32_t ecx;
  uint32_t edx;
  uint32_t ebx;
  uint32_t esp;
  uint32_t ebp;
  uint32_t esi;
  uint32_t edi;
  uint32_t es;
  uint32_t cs;
  uint32_t ss;
  uint32_t ds;
  uint32_t fs;
  uint32_t gs;
  uint32_t ldt;
  uint16_t debug_trap;
  uint16_t io_bitmap_offset;
};

void tss_init();

/**
 * @brief Update the value of ESP0 in the Task State Segment (TSS) to point to
 * the thread/process's privilege level 0 stack.
 *
 * @param pthread Pointer to the task_struct of the thread/process
 *
 * This function sets ESP0 to the address just beyond the top of the
 * thread/process's kernel stack, assuming the stack grows downward.
 */
void tss_esp_update(struct task_struct* pthread);

#endif // !_INCLUDE_TSS_H_
